package alocador.entidades.salas;

import alocador.entidades.salas.propriedades.Propriedade;
import alocador.exceptions.PropriedadeInvalidaException;
import alocador.exceptions.SalaInvalidaException;
import alocador.exceptions.TipoInvalidoException;
import alocador.util.VerificaInvalido;

import java.util.List;

/**
 * Sala que guarda informacoes de uma Sala
 */
public class SalaConcreta {

	private String nome;
	private int capacidade;
	private String apelido;
	private String classificacao;
	private String subTipo;
	private List<Propriedade> propriedadesSubTipo;

	/**
	 * Construtor da Classe
	 * 
	 * @param nome
	 *            Nome da Sala
	 * @param capacidade
	 *            Capacidade de Alunos
	 * @param apelido
	 *            Apelido da Sala
	 * @param classificacao
	 *            Classificacao da Sala
	 * @param subTipo
	 *            SubTipo da Classificacao
	 * @param propriedadesSubTipo
	 *            Parametros para suas Propriedades
	 * @throws SalaInvalidaException
	 *             Caso algum dos parametros sejam invalidos
	 */
	public SalaConcreta(String nome, int capacidade, String apelido,
			String classificacao, String subTipo,
			List<Propriedade> propriedadesSubTipo) throws SalaInvalidaException {

		if (VerificaInvalido.basico(nome))
			throw new SalaInvalidaException("Identificacao Invalida");
		if (capacidade <= 0)
			throw new SalaInvalidaException("Capacidade Invalida");

		this.nome = nome;
		this.capacidade = capacidade;
		this.apelido = apelido;
		this.classificacao = classificacao;
		this.subTipo = subTipo;
		this.propriedadesSubTipo = propriedadesSubTipo;
	}

	/**
	 * Metodo acessador se esta sala eh Possivel ser Alocavel
	 * 
	 * @return True - Se Puder ser Alocada<br>
	 *         False - Caso Contrario
	 */
	public boolean isAlocavel() {

		boolean permite = true;

		for (Propriedade p : propriedadesSubTipo)
			permite = permite && p.permiteAlocacao();

		return permite;
	}

	/**
	 * Metodo modificador de uma Propriedade da Sala
	 * 
	 * @param propriedade
	 *            Propriedade que sera modificada
	 * @param novoEstado
	 *            Novo estado da Propriedade<br>
	 *            Ex: "true" para SerAberta
	 * @throws PropriedadeInvalidaException
	 *             Caso a propriedade nao exista ou o estado seja invalido
	 */
	public void setPropriedade(String propriedade, String novoEstado)
			throws PropriedadeInvalidaException {

		boolean propriedadeMudou = false;

		for (Propriedade p : propriedadesSubTipo) {
			if (p.getNome().equalsIgnoreCase(propriedade)) {
				p.setParametro(novoEstado);
				propriedadeMudou = true;
			}
		}

		if (!propriedadeMudou)
			throw new PropriedadeInvalidaException("Propriedade Nao Existente");

	}

	/**
	 * Metodo acessador para o nome
	 * 
	 * @return nome
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * Metodo acessador para a capacidade
	 * 
	 * @return capacidade
	 */

	public int getCapacidade() {
		return capacidade;
	}

	/**
	 * Metodo acessador para o apelido
	 * 
	 * @return apelido
	 */

	public String getApelido() {
		return apelido;
	}

	/**
	 * Metodo acessador para a classificacao
	 * 
	 * @return classificacao
	 */

	public String getClassificacao() {
		return classificacao;
	}

	/**
	 * Metodo acessador para o Tipo da Sala
	 * 
	 * @return Tipo da Sala
	 * @throws TipoInvalidoException
	 *             Caso a sala nao possua Tipo
	 */
	public String getSubTipo() throws TipoInvalidoException {

		if (subTipo.equalsIgnoreCase("SemTipo"))
			throw new TipoInvalidoException("Atributo invalido");

		return subTipo;
	}

}
